/**
在TypeScript中，映射类型的修饰符符号用于对类型的属性进行修改和控制。
  1. 可选属性修饰符  `?` 
  - 符号： `?` 
  - 作用：将属性标记为可选，表示该属性可以存在也可以不存在。
    
    例如：
  type Person = {
        name: string;
        age: number;
    };

    type PartialPerson = {
        [K in keyof Person]?: Person[K];
    };
    // PartialPerson 的类型为 { name?: string; age?: number; }
  2. 只读属性修饰符  `readonly` 
  - 符号： `readonly` 
  - 作用：将属性标记为只读，表示该属性在对象创建后不能被修改。
    
    例如：
  type ReadonlyPerson = {
        readonly [K in keyof Person]: Person[K];
    };
    // ReadonlyPerson 的类型为 { readonly name: string; readonly age: number; }
  3. 组合修饰符
  - 可以将可选属性和只读属性修饰符结合使用，以创建既可选又只读的属性。
    
    例如：
  type OptionalReadonlyPerson = {
        readonly [K in keyof Person]?: Person[K];
    };
    // OptionalReadonlyPerson 的类型为 { readonly name?: string; readonly age?: number; }
  4. 条件类型结合映射类型
  - 在映射类型中，可以使用条件类型符号  `extends`  来根据属性的类型进行不同的转换。
    
    例如：
  type Nullable<T> = {
        [K in keyof T]: T[K] extends object ? T[K] | null : T[K];
    };

    type NullablePerson = Nullable<Person>;
    // NullablePerson 的类型为 { name: string | null; age: number | null; }
  5. 总结
  映射类型的修饰符符号在TypeScript中提供了灵活的方式来控制类型属性的行为。通过使用可选属性符号  `?`  和只读符号  `readonly` ，开发者可以定义更复杂的类型结构，以满足不同的需求。这些修饰符符号在增强类型安全性和提升代码可维护性方面起到了重要作用。
 */
type MapPerson<Type> = {
  -readonly [Persperty in keyof Type]-?: Type[Persperty]
}

interface IPerson {
  name: string;
  age?: number;
  readonly height: number;
  address?: string;
}

type IPersonRequiredOnly = MapPerson<IPerson>

const p: IPersonRequiredOnly = {
  name: '张三',
  age: 18,
  height: 180,
  address: '北京'
}


export {}
